package trastienda.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import trastienda.excepcion.DAOExcepcion;
import trastienda.modelo.Producto;
import trastienda.modelo.Usuario;

@Repository
public class ProductoDAOImpl implements ProductoDAO {
	
	@PersistenceContext
	private EntityManager em;

	public void setEm(EntityManager em) {
		this.em = em;
	}

	@Autowired
	private JdbcTemplate jdbcTemplate;

	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}
	
	@SuppressWarnings(value = "unchecked")
	public Collection<Producto> listarTodos() throws DAOExcepcion {
	        System.out.println("ProductoDAOImpl: listarTodos()");
	        Collection<Producto> entities = new ArrayList<Producto>();
			try {
				Query q = em.createNamedQuery("Producto.seleccionarTodos");
				entities = q.getResultList();
			} catch (Exception e) {
				throw new DAOExcepcion(e.getMessage());
			}
			return entities;
	}
	
	
	@SuppressWarnings(value = "unchecked")
    public Collection<Producto> buscarPorNombre(String nombre)
                    throws DAOExcepcion {
            System.out.println("ProductoDAOImpl: buscarPorNombre() : " + nombre);

            Query q = em.createQuery("select p from Producto p where p.nombre like :nombre ");

    		q.setParameter("nombre", "%" + nombre + "%");
    		return q.getResultList();
    }
	
	
	public void insertar(Producto pro) throws DAOExcepcion{
		System.out.println("ProductoDAOImpl: insertar()");
		try {
			em.persist(pro);
		} catch (Exception e) {
			e.printStackTrace();
			throw new DAOExcepcion(e.getMessage());
		}		
	}

	public Producto obtenerPorIdProducto(int idProducto) throws DAOExcepcion {
		System.out.println("ProductoDAOImpl: obtenerPorIdProducto() : "	+ idProducto);

		try {
			return em.find(Producto.class, idProducto);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}
	
	public void actualizar(Producto pro) throws DAOExcepcion {
		System.out.println("ProductoDAOImpl: actualizar() : "	+ pro.getIdProducto());
		try {
			em.merge(pro);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}		
	}
	
	public void eliminar(int idProducto) throws DAOExcepcion {
		System.out.println("ProductoDAOImpl: eliminar() : "	+ idProducto);
		try {
			Producto r = em.find(Producto.class, idProducto);
			em.remove(r);
		} catch (Exception e) {
			throw new DAOExcepcion(e.getMessage());
		}
	}

	
	@SuppressWarnings(value = "unchecked")
    public Collection<Producto> buscarPorCategoria(String categoria) throws DAOExcepcion {
            System.out.println("ProductoDAOImpl: buscarPorCategoria() : " + categoria);
            Query q = em.createQuery("select p from Producto p where p.categoria.nombre = :categoria ");

    		q.setParameter("categoria", categoria);
    		return q.getResultList();

    }
	
	@SuppressWarnings(value = "unchecked")
    public Collection<Producto> buscarPorImportancia(int importancia) throws DAOExcepcion {
            System.out.println("ProductoDAOImpl: buscarPorImportancia() : " + importancia);
            Query q = em.createQuery("select p from Producto p where p.importancia = :importancia ");

    		q.setParameter("importancia", importancia);
    		return q.getResultList();

    }


}
